#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int maxn=12;

char a[maxn][maxn], b[maxn][maxn];
int n, lie[maxn];
set<string> v;
set<string> se;
bool findans;

// 第 i 行放 s
bool check(int i, string s){
	for(int j=0;j<n;j++){
		if(b[i][j]=='_') continue;
		if(b[i][j]!=s[j]) return false;
	}
	return true;
}

void print(){
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cout<<a[i][j];
		}
		cout<<'\n';
	}
}

void dfs(int x, int lie[]){
	if(x==n){ // 完了
		set<string> st;
		for(int j=0;j<n;j++){ // 个数
			if(lie[j]!=n/2) return;
			string tmp;
			for(int i=0;i<n;i++){
				tmp+=a[i][j];
			}
			st.insert(tmp);
		}
		if(st.size() != n){ // 有重复的
			return ;
		}
		print();
		return;
	}
	
	// 还没处理完
	for(string s: v){
		if(!check(x, s)||se.count(s)) continue;
		// 查看个数
		
		bool flag=true;
		for(int j=0;j<n;j++){
			int cnt=(s[j]=='1');
			if((cnt+lie[j])>n/2||((x+1)-(cnt+lie[j]))>n/2){
				flag=false;
				break;
			}
		}
		if(!flag) continue;
		
		// 是否有连续三个
		if(x>=2){
			for(int j=0;j<n;j++){
				if(s[j]==a[x-1][j]&&s[j]==a[x-2][j]){
					flag=false;
					break;
				}	
			}
		}
		if(!flag) continue;
		
		// 开始处理
		for(int j=0;j<n;j++){
			a[x][j]=s[j];
			if(s[j]=='1') lie[j]++;
		}
		se.insert(s);
		
		dfs(x+1, lie);
		
		// 还原现场
		for(int j=0;j<n;j++){
//			if(b[x][j]=='_') a[x][j]='_';
			if(s[j]=='1') lie[j]--;
		}
		se.erase(s);
	}
}


void init(){
	for(int i=0;i<(1<<n);i++){
		int cnt=0, t=i;
		while(t){
			cnt++;
			t&=(t-1);
		}
		if(cnt!=n/2) continue; // 个数
		int tmp=i;
		string s;
		for(int j=0;j<n;j++){
			if(tmp&1){
				s+='1';
			} else {
				s+='0';
			}
			tmp>>=1;
		}
		bool flag=true;
		for(int j=0;j<=n-3;j++){
			if(s[j]==s[j+1]&&s[j+1]==s[j+2]){
				flag=false;
				break;
			}
		}
		if(flag){
			v.insert(s);
		}
	}
}

void solve(){
	cin>>n;
	for(int i=0;i<n;i++){
		string s;
		cin>>s;
		for(int j=0;j<n;j++){
			a[i][j]=b[i][j]=s[j];
		}
	}
	
	// 初始化,每行都能写什么值
	init();

	dfs(0, lie);
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0),cout.tie(0);
	solve();
	return 0;
}
